package zdori;

public class J21_AccessModifier {

	/**
	 * @param args
	 * 캡슐화 encapsulation와 접근 제어
	 * opp의 원칙에서 캡슐화는 객체의 일부를 "보호"하고 노출해도 상관없느느 부분을 노출했을 때에는 "안전"해야 한다는 메커니즘
	 * 
	 * 예를들면 TV는 캡슐화의 좋은 예임
	 * TV의 수많은 부품들은 금속커버안에 넣어둠
	 * 클라스 개발자는 변수와 메서드 들을 외부로부터 감춰두어야함
	 * 
	 * 자바는 접근 제어를 통해 캡슐화를 지원함
	 * 접근 제어의 종류에는 4가지가 존재
	 * private 자신만 접근 가능, 그외에는 접근 불가
	 * protected 상속관계의 클래스만 접근 가능
	 * public 어디서나 접근가능함을 의미
	 * default 기본 패키지 내 클래스들끼리만 접근 가능
	 * 
	 * 클라스에 적용: public ,default 만 사용가능
	 * 멤버변수에 사용 : public, protected, private, default
	 * 메서드에 적용 : public, protected, private, default
	 * 
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//default 클래스 불러오기 (실패)
		//default 패키지에 선언된 클래스는 같은 패키지내에 존재하는 클래스 만이 접근가능
		//즉 seistageek 패키지에서 default 패키지에 있는 클래스로 접근이 안됨
		//J21_DefaultClass dfc = new J21_DefaultClass(); 패키지가 다름
		
		//J21_DefaultClass 클라스가 public 이라 하더라도 default 패키지 내에 있으므로 접근불가
		//J21_DefaultClass pbc = new J21_DefaultClass();
		
		//J21_DefaultClass 클래스는 public 이기 때문에 아무패키지라도 접근가능
		
		J21_PublicClass pbc1 = new J21_PublicClass();
		ex.J21_PublicClass pbc2 = new ex.J21_PublicClass();
		
		//클래스의 멤버 변수에 접근
		//같은 패키지 내 멤버변수 접근 pbc1
		pbc1.defautval = 1;
		pbc1.publicval = 2;
		//pbc1.privateval = 3;
		
		//다른 패키지 내 멤버변수 접근 pbc2
		//pbc2.defautval = 4;
		pbc2.publicval = 5;
		//pbc2.privateval = 6;
		
		
		pbc1.defaultMethod();
		pbc1.publicMethod();
		//pbc1.privateMethod();
		
		//pbc2.defaultMethod();
		pbc2.publicMethod();
		//pbc2.privateMethod();
		
		//결론
		//oop의 캡슐화 원칙에 따라 클래스이 멤버변수들은 무조건 private  tjsdjs
		//클래스의 메서드 들은 외부에 노출하려면 public으로 선언하고 , 그 외의 경우에는 protected 로 선언
		
	}

}
